// 回文检查器
class Dequeue {
    constructor () {
      this.count = 0
      this.lowestCount = 0
      this.items = {}
    }
    size () {
      return this.count - this.lowestCount
    }
    isEmpty () {
      return this.size() === 0
    }
    clear () {
      this.count = 0
      this.lowestCount = 0
      this.items = {}
    }
    toString () {
      if (this.isEmpty()) {
        return ''
      }
      let strObj = this.items[this.lowestCount]
      for (let i = this.lowestCount + 1; i < this.count; i++) {
        strObj = `${strObj},${this.items[i]}`
      }
      return strObj
    }
    addFront (element) {
      if (this.isEmpty()) {
        this.addBack(element)
      } else {
        this.items[--this.lowestCount] = element
      }
    }
    addBack (element) {
      this.items[this.count] = element
      this.count++
    }
    removeFront () {
      if (this.isEmpty()) {
        return undefined
      }
      const result = this.items[this.lowestCount]
      delete this.items[this.lowestCount]
      this.lowestCount++
      return result
    }
    removeBack () {
      if (this.isEmpty()) {
        return undefined
      }
      this.count--
      const result = this.items[this.count]
      delete this.items[this.count]
      return result
    }
    peekFront () {
      if (this.isEmpty()) {
        return undefined
      }
      return this.items[this.lowestCount]
    }
    peekBack () {
      if (this.isEmpty()) {
        return undefined
      }
      return this.items[this.count - 1]
    }
}


function palindromeChecker (str) {
    if (str === undefined || str === null || (str !== null && str.length === 0)) {
      return false
    }
    const dequeue = new Dequeue()
    // 转换为小写，并移除所有空格
    const lowerStr = str.toLowerCase().replace(/\s/g, '')
    let isEqual = true
    let firstChar, lastChar
    for (let i = 0; i < lowerStr.length; i++) {
      dequeue.addBack(lowerStr.charAt(i))//返回字符串中指定索引（下标）处的字符
    }
    while (dequeue.size() > 1 && isEqual) {
      firstChar = dequeue.removeFront()
      lastChar = dequeue.removeBack()
      if (firstChar !== lastChar) {
        isEqual = false
      }
    }
    return isEqual
}

// 代码分析：
// 在我们检查是否回文之前，需要先对传入的字符串做一些校验，如果传递的是undefined，null或者空字符串直接返回false。
// 随后我们实例化了一个我们在之前写好的双端队列Dequeue类。
// 为了避免字符串大小写的问题，我们统一把传入的字符串转换成小写的形式。
// 遍历字符串，并把字符串中的每一个字符依次添加到双端队列的末尾。
// 循环在双端队列的前端和后端移除一个元素，并比较这两个元素，如果相等则进行下一次循环，如果不相等则结束循环。

// 在撰写问回文检查器代码后，我们写一点代码来测试一下：
console.log(palindromeChecker('a'))      // true
console.log(palindromeChecker('aa'))     // true
console.log(palindromeChecker('kayak'))  // true
console.log(palindromeChecker('level'))  // true
console.log( palindromeChecker('ABBC'))  // false

